2018.10.12 星期五 17:15
new操作符的工作原理
1 | var F=function(){ |
用new调用一个函数发生了这些事:
(1)新建一个对象instance=new Object()
;
(2)设置原型链instance.__proto__=F.prototype
;
(3)让F中的this指向instance,执行F的函数体。
(4)判断F的返回值类型:
如果是值类型,就丢弃它,还是返回instance。
如果是引用类型,就返回这个引用类型的对象,替换掉instance。
注:(1)如果没有写return,相当于return undefined,JavaScript中的函数都是这样。undefined是值类型的,因此丢弃它,返回instance。
(2)如果return this相当于返回一个引用类型的对象,它自己就是instance,无所谓替换不替换了。
(3)对instance并不需要设置它的constructor属性,这个属性在instance的原型中。
而且,任意一个新函数在创建时,原型的constructor就已经设置好了。
于是,这也要求我们在对prototype重新赋值的时候,重新指定constructor属性。1
2
3
4
5
6
7
8
9
10console.assert(!p.hasOwnProperty('constructor'));
console.assert(F.prototype.hasOwnProperty('constructor'));
// 而且 。。
var G=function(){};
console.assert(G.prototype.hasOwnProperty('constructor'));
console.assert(G.prototype.constructor===G);
// 重新指定constructor属性。
F.prototype={
constructor:F
};
实现
1 | function New(f) { |
练习
1 | // new 、this、以及原型链相关问 |
Object()和new Object()
当以非构造函数形式被调用时,Object 等同于 new Object()
与.运算优先级比较
new是有参的,与.运算符同级,按照从左向右的执行顺序,先执行new Foo()
new无参级别低一个档次,先进行.运算符
18:55